package com.itheima.controller.user;



import com.itheima.api.user.UmsRoleService;
import com.itheima.vo.domain.AjaxResult;
import com.itheima.vo.domain.TableDataInfo;
import com.itheima.vo.dto.RoleDto;
import com.itheima.vo.pojo.UmsMenu;
import com.itheima.vo.pojo.UmsResource;
import com.itheima.vo.pojo.UmsRole;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.List;


/**
 * 后台用户角色web层
 */
@RestController
@RequestMapping("role")
@Slf4j
public class UmsRoleController {

    @DubboReference
    private UmsRoleService roleService;


    /**
     * 给角色分配菜单
     * @param roleDto 封装角色id,菜单ids
     * @return 提示信息
     */
    @PostMapping("allocMenu")
    public AjaxResult allocMenu(RoleDto roleDto){
        log.info("给角色分配菜单:{}",roleDto);
        return roleService.allocMenu(roleDto);
    }

    /**
     *给角色分配资源
     * @param roleDto 封装角色id,资源ids
     * @return 提示信息
     */
    @PostMapping("allocResource")
    public AjaxResult allocResource(RoleDto roleDto){
        log.info("给角色分配资源:{}",roleDto);
        return roleService.allocResource(roleDto);
    }

    /**
     * 添加角色
     * @param role 角色信息
     * @return 提示信息
     */
    @PostMapping("create")
    public AjaxResult createRole(@RequestBody UmsRole role){
        log.info("添加角色:{}",role);
        role.setCreateTime(LocalDateTime.now());
        roleService.save(role);
        return AjaxResult.success();
    }

    /**
     * 批量删除角色
     * @param ids 角色id
     * @return  提示信息
     */
    @PostMapping("delete")
    public AjaxResult deleteRoles(@RequestBody List<Long> ids){
        log.info("删除角色id:{}",ids);
        if(ids==null || ids.size()==0) return AjaxResult.error("角色不存在");
        roleService.deleteRoles(ids);
        return AjaxResult.success();
    }

    /**
     * 根据角色名称分页获取角色列表
     * @param keyword  角色名称
     * @param pageNum  当前页码
     * @param pageSize  当前页条目数
     * @return  分页数据
     */
    @GetMapping("list")
    public AjaxResult getRoleList(String keyword,Integer pageNum,Integer pageSize){
        log.info("获取角色列表:keyword={},pageNum={},pageSize={}",keyword,pageNum,pageSize);
        TableDataInfo tableDataInfo=roleService.getRoleList(keyword,pageNum,pageSize);
        return AjaxResult.success(tableDataInfo);
    }

    /**
     * 获取所有角色
     * @return 角色集合
     */
    @GetMapping("listAll")
    public AjaxResult getAllRole(){
        log.info("获取所有角色");
        List<UmsRole> roles = roleService.list();
        if(roles==null || roles.size()==0) return AjaxResult.error("暂无角色");
        return AjaxResult.success(roles);
    }

    /**
     * 获取角色相关菜单
     * @param roleId 角色id
     * @return  菜单数据
     */
    @GetMapping("listMenu/{roleId}")
    public AjaxResult getRoleMenuList(@PathVariable Long roleId){
        log.info("获取角色相关菜单:{}",roleId);
        if (roleId==null) return AjaxResult.error("角色不存在");
        List<UmsMenu> menus=roleService.getRoleMenuList(roleId);
        return AjaxResult.success(menus);
    }

    /**
     *获取角色相关资源
     * @param roleId 角色id
     * @return 资源数据
     */
    @GetMapping("listResource/{roleId}")
    public AjaxResult getListResource(@PathVariable Long roleId){
        log.info("获取角色相关资源:{}",roleId);
        if (roleId==null) return AjaxResult.error("角色不存在");
        List<UmsResource> resources=roleService.getListResource(roleId);
        return AjaxResult.success(resources);
    }

    /**
     * 修改角色
     * @param id 需要修改的id
     * @param role  角色信息
     * @return  提示信息
     */
    @PostMapping("update/{id}")
    public AjaxResult updateRoleById(@PathVariable Long id,@RequestBody UmsRole role){
        log.info("修改角色信息:id={},修改为:{}",id,role);
        if(id==null || role ==null) return AjaxResult.error("角色错误");
        role.setId(id);
        roleService.updateById(role);
        return AjaxResult.success();
    }

    /**
     * 修改角色状态
     * @param id 需要修改的id
     * @param status 封装状态信息
     * @return  提示信息
     */
    @PostMapping("updateStatus/{id}")
    public AjaxResult updateRoleStatusById(@PathVariable Long id, Integer status){
        log.info("修改角色状态:id={},修改为:{}",id,status);
        if(id==null || status ==null) return AjaxResult.error("角色错误");
        UmsRole umsRole = roleService.getById(id);
        if(umsRole == null) return AjaxResult.error("角色不存在");
        if(umsRole.getStatus().equals(status)) return AjaxResult.error("已是当前状态,无法修改");
        UmsRole role=new UmsRole();
        role.setStatus(status);
        role.setId(id);
        //修改状态
        roleService.updateById(role);
        return AjaxResult.success();
    }

}
